# -*- coding: utf-8 -*-#
#-------------------------------------------------------------------------------
# 建立者:        Young  
# Name:         demo12.08
# Description:
# Author:       $赵怡蕾
# Date:         2019/3/18
#-------------------------------------------------------------------------------

from heapq import *
from random import *
data = [1,2,3,4,5,6,7,8,9]
# 定义一个堆，其实堆就是一个列表，只是通过heapq模块中的函数利用堆算法来改变列表中的元素而已
heap = []
for n in data:
    # 利用choice函数从data列表中随机选择9个数（可能有重复的数）
    value = choice(data)
    # 使用heappush函数将value添加进堆
    heappush(heap,value)
# 运行结果：[1, 3, 5, 5, 6, 7, 7, 9, 7]
print(heap)
# 将2.5添加进堆
heappush(heap,2.5)
# 运行结果：[1, 1, 2, 6, 2.5, 9, 9, 7, 8, 9]
print(heap)
# 弹出heap中最小的值，并获取这个最小值，运行结果：1
print(heappop(heap))

data1 = [6,3,1,12,8]
# 将data1转换为堆（直接修改了data1）
heapify(data1)
# 运行结果：[1, 3, 6, 12, 8]
print(data1)
# 弹出data1中的最小值，并将100添加进堆
heapreplace(data1,100)
# 运行结果：[3, 8, 6, 12, 100]
print(data1)
# 得到data1中最大的值，运行结果：[100]
print(nlargest(1,data1))
# 得到data1中最大的前2个值，运行结果：[100, 12]
print(nlargest(2,data1))
# 得到data1中最小的值，运行结果：[3]
print(nsmallest(1,data1))
# 得到data1中最小的前3个值，运行结果：[3, 6, 8]
print(nsmallest(3,data1))
# 合并多个有序的列表，并得到一个新的有序列表
# 运行结果：[0, 1, 2, 3, 4, 5, 8, 10, 15, 20, 25, 1234, 7]
print(list(merge([1,3,1234,7],[0,2,4,8],[5,10,15,20],[],[25])))
# 合并多个有序列表，并通过key关键字参数指定一个函数len，也就是说，会按列表元素值的长度进行排序
# 运行结果：['dog', 'cat', 'fish', 'horse', 'kangaroo']
print(list(merge(['dog','horse'],['cat','fish','kangaroo'],key=len)))